"""author: wenyao
   data: 2021/11/5
   project: cjh
"""
#字典是Python中一个键值映射的数据结构
#字典是无序的
#字典是可变对象
#key必须是唯一的, so 天生去重

#key 必须是可hash对象（不可变数据类型）
#hash  是一类算法的统称，  将任意长度的输入变成固定长度的输出
#hash 是一项单向加密技术  可以通过原文得到hash值，但是不能通过hash去推导出原文
#     常常用在验证文件的完成性，有没有被篡改,传输过程中有没有传完整

#字典的原理
#字典本质就是一个空闲的hash表
#以空间换时间

#key必须是唯一的，而且必须是可hash对象
#value可以是任何值
#字典的定义
# >>> d1 = {"a":1,"b":2}
# >>> d1
# {'a': 1, 'b': 2}
# >>> d1["a"]
# 1
# >>> d2 = {}
# >>> type(d2)
# <class 'dict'>
# >>> d3 = dict()
# >>> d3
# {}
# >>> d3 = dict("abc")
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# ValueError: dictionary update sequence element #0 has length 1; 2 is required
# >>> d3 = dict(a=1,b=2,c=3)
# >>> d3
# {'a': 1, 'b': 2, 'c': 3}
# >>> d3 = dict([('root','123456'),('admin','admin')])
# >>> d3
# {'root': '123456', 'admin': 'admin'}
# >>> d3['root']
# '123456'
# >>> user = {"root":{"passwd":"123456","money":13},"admin":{"passwd":"123456","money":14}}
# >>> user["root"]

#############增删改查##############
#查看
#一、 dict[key]    #当key不存在的时候会报错
# >>> d1
# {'a': 1, 'b': 2}
# >>> d1['a']
# 1
# >>> d1['c']
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# KeyError: 'c'

#二、dict.get(key,default)   #获取key的值，如果没有就返回default的值
# >>> d1
# {'a': 1, 'b': 2}
# >>> d1.get("a")
# 1
# >>> d1.get("c")           #如果没有default，不存在key的话就返回None
# >>> d1.get("c",0)
# 0
# >>> d1.get("a",0)
# 1

##新增和修改
#dict[key] = value
#当key存在的时候，就是修改。
#当key不存在，就是新增
# >>> d1
# {'a': 1, 'b': 2}
# >>> d1["a"] = 3
# >>> d1
# {'a': 3, 'b': 2}
# >>> d["c"] = 1
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# NameError: name 'd' is not defined
# >>> d1["c"] = 1
# >>> d1
# {'a': 3, 'b': 2, 'c': 1}


###练习
# str1 = "lskdfoweisssf"
#统计字符串中的每个字符出现的次数，不要重复输出
# d1 = {}
# for i in str1:
#     d1[i] = d1.get(i,0) + 1
# print(d1)

#set(str1)

#删除
# >>> d1
# {'a': 3, 'b': 2, 'c': 1, 'd': 5}
# >>> d1.pop("a")
# 3
# >>> d1
# {'b': 2, 'c': 1, 'd': 5}
# >>> d1.popitem()
# ('d', 5)

#######字典的合并
# >>> d1
# {'b': 2}
# >>> d2 = {"a":2}
# >>> dict(d1, **d2)
# {'b': 2, 'a': 2}
# >>> d1.update(d2)
# >>> d1
# {'b': 2, 'a': 2}
# >>> d1 + d2
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: unsupported operand type(s) for +: 'dict' and 'dict'

# >>> d1
# {'a': 1, 'b': 2}
# >>> d2
# {'c': 1, 'b': 3}
# >>> d1.update(d2)
# >>> d1
# {'a': 1, 'b': 3, 'c': 1}

#########成员关系判断
# >>> d1
# {'a': 1, 'b': 3, 'c': 1}
# >>> 'a' in d1
# True
# >>> 1 in d1
# False
# >>> d1.keys()
# dict_keys(['a', 'b', 'c'])
# >>> d1.values()
# dict_values([1, 3, 1])
# >>> d1.values()[1]
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: 'dict_values' object does not support indexing
# >>> d1.values()
# dict_values([1, 3, 1])
# >>> list(d1.values())
# [1, 3, 1]
# >>> list(d1.keys())
# ['a', 'b', 'c']

##########字典遍历
# >>> for i in d1.items():
# ...    print(i)
# ...
# ('a', 1)
# ('b', 3)
# ('c', 1)
# >>> for i in d1:
# ...   print(i)
# ...
# a
# b
# c
# >>>




